// 定义Config结构体
package config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"github.com/zxmrlc/log"
	"os"
)

type Config struct {
	Name string //配置文件名字
	//新增，k8s配置
	RunMode   string `yaml:"runmode"`
	Addr      string `yaml:"addr"`
	JWTSecret string `yaml:"jwt_secret"`
	Expir     int    `yaml:"expir"`
	DB        DBConfig
}

// 新增 DBConfig 结构体
type DBConfig struct {
	Name     string `yaml:"name"`
	Addr     string `yaml:"addr"`     // 从环境变量覆盖
	Username string `yaml:"username"` // 从环境变量覆盖
	Password string `yaml:"password"` // 从环境变量覆盖
}

// 初始化数据库配置（从环境变量优先）
func (c *Config) InitDBConfig() {
	// 从环境变量读取（如果存在）
	if envAddr := os.Getenv("MYSQL_ADDR"); envAddr != "" {
		c.DB.Addr = envAddr
		//c.DB.Addr = "192.168.67.155"
	}
	if envUser := os.Getenv("MYSQL_USER"); envUser != "" {
		c.DB.Username = envUser
		//c.DB.Username = "psl"
	}
	if envPassword := os.Getenv("MYSQL_PASSWORD"); envPassword != "" {
		c.DB.Password = envPassword
		//c.DB.Password = "psl123"
	}
	// 如果环境变量未设置，保持 yaml 中的默认值
}

// 读取log配置
func (c *Config) Initlog() {
	Cfg := log.PassLagerCfg{
		Writers:        viper.GetString("log.writers"),
		LoggerLevel:    viper.GetString("log.logger_level"),
		LoggerFile:     viper.GetString("log.logger_file"),
		LogFormatText:  viper.GetBool("log.log_format_text"),
		RollingPolicy:  viper.GetString("log.rollingPolicy"),
		LogRotateDate:  viper.GetInt("log.log_rotate_date"),
		LogRotateSize:  viper.GetInt("log.log_rotate_size"),
		LogBackupCount: viper.GetInt("log.log_backup_count"),
	}
	log.InitWithConfig(&Cfg) //初始化日志系统
}

// 监控配置文件变化，并且热加载程序
func (c *Config) WatchConfig() {
	viper.WatchConfig()
	//配置发生改变的时候做什么事情
	viper.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println(viper.GetString("name"))
		//fmt.Printf("config file changes:%s\n", e.Name)
		log.Infof("config file changes:%s", e.Name)
	})
}

// 为结构体添加方法 InitConfig --》初始化配置文件

//func (c *Config) InitConfig() error {
//	if c.Name != "" {
//		//如果Config实例化的时候指定了Name，则解析制定的配置文件
//		viper.SetConfigFile(c.Name)
//	} else {
//		//如果没有指定配置文件，则默认解析（conf/config）
//		viper.AddConfigPath("conf")
//		viper.SetConfigName("config")
//	}
//	//设置配置文件格式为yaml
//	viper.SetConfigType("yaml")
//	//读取配置发生错误就返回err
//	if err := viper.ReadInConfig(); err != nil {
//		return err
//	}
//	//初始化log
//	c.Initlog()
//	//监控文件变化
//	c.WatchConfig()
//
//	return nil
//}

// 修改 InitConfig 方法
func (c *Config) InitConfig() error {
	// 原有 viper 配置读取逻辑
	if c.Name != "" {
		viper.SetConfigFile(c.Name)
	} else {
		viper.AddConfigPath("conf")
		viper.SetConfigName("config")
	}
	viper.SetConfigType("yaml")
	if err := viper.ReadInConfig(); err != nil {
		return err
	}

	// 将配置解析到结构体
	if err := viper.Unmarshal(c); err != nil {
		return err
	}

	// 初始化数据库配置（覆盖环境变量）
	c.InitDBConfig()

	// 初始化日志和监控
	c.Initlog()
	c.WatchConfig()

	return nil
}
